#include "queue.h"

/**
***********************************************************************
* @brief   初始化队列
* @param   LinkedQueue *queue, size_t capacity
* @retval  无
* @note  
***********************************************************************
*/
void initQueue(LinkedQueue *queue)
{
	queue->head = NULL;
	queue->length = 0;
}

/**
***********************************************************************
* @brief   返回队列内元素个数
* @param   const Queue *queue
* @retval  队列元素长度
* @note  
***********************************************************************
*/
size_t getSize(const LinkedQueue *queue)
{
	return queue->length;
}

/**
***********************************************************************
* @brief   元素入队列
* @param   Queue *queue, int element
* @retval  
* @note  
***********************************************************************
*/
void enqueue(LinkedQueue *queue, int element)
{
	Queue *node_queue = (Queue *)malloc(sizeof(Queue) * 1);//申请插入节点（入队）内存空间
	/*判断内存申请是否成功*/
	if(node_queue == NULL)
	{
		printf("内存申请失败\n");
		return;
	}
	printf("内存申请成功\n");
	node_queue->data = element;//存入元素

	/*判断链表（队列）是否为空*/
	if(queue->length == 0)
	{
		queue->head = node_queue;
		queue->length ++;
	}
	else//在节点（队列）末尾插入元素
	{	
		Queue *currentNode = queue->head;
		for(int i = 0; i < queue->length - 1; i++)
		{
			currentNode = currentNode->next;
		}
		currentNode->next = node_queue;
		queue->length ++;
	}
}

/**
***********************************************************************
* @brief   元素出队列
* @param   Queue *queue
* @retval  返回出队列的元素
* @note  
***********************************************************************
*/
int dequeue(LinkedQueue *queue)
{
	/*判断队列是否为空*/
	if(queue->length == 0)
	{
		printf("队列为空，出队失败\n");
		return -1;
	}
	Queue *delete_queue = queue->head;//记录出队的首节点
	queue->head = delete_queue->next;//将头节点指向删除节点的下一个节点地址
	return delete_queue->data;
}

/**
***********************************************************************
* @brief   释放队列内存
* @param   Queue *queue
* @retval  无
* @note  
***********************************************************************
*/
void destroyQueue(LinkedQueue *queue)
{
	Queue *currentNode = queue->head;
	for(int i = 0; i < queue->length; i++)
	{
		Queue *tempNode = currentNode;
		currentNode = currentNode->next;
		free(tempNode);
	}
	queue->head = NULL;
	queue->length = 0;
}

/**
***********************************************************************
* @brief   遍历队列
* @param   Queue *queue
* @retval  
* @note  
***********************************************************************
*/
void printQueue(LinkedQueue *queue)
{
	Queue *currentNode = queue->head;
	for(int i = 0; i < queue->length; i++)
	{
		Queue *tempNode = currentNode;
		currentNode = currentNode->next;
		printf("%d ", tempNode->data);
	}
	printf("\n");
}